Note: This script runs on R 4.0 (scMappR R version dependency)

scMappR was updated to v1.0.7 (2021-10-16 ver). Ensure that Seurat version is 3.2.3.

This script runs scMappR (https://cran.r-project.org/web/packages/scMappR/index.html) to identify cell-type specific DE genes by calculating cell-weighted fold-changes (cwFC) for bulk DE genes with cell proportions estimated by single cell deconvolution. scMappR is run with sex-biased genes identified at each age. cwFC calculated by scMappR is further processed, however, only PD22 and 37 yielded cwFC for DE genes with high confidence. Genes predicted to be cell-type specific sex-biased genes checked for in 3 gene lists:

  1. Sex-biased genes identified in rat anterior pituitary by scRNA-seq (Fletcher et al 2019; https://doi.org/10.3389/fendo.2019.00623)
  2. Genes associated with puberty, puberty-related diseases, pituitary diseases.
  3. Sex-biased genes identified in the human pituitary by GTEx (Oliva et al 2020; https://doi.org/10.1126/science.aba3066)

Updates:

  • 2022/01/11: Updated cwFoldChange_evaluate_new (old custom function from Dustin) to cwFoldChange_evaluate (official function in scMappR); change made in functions R script.
  • 2022/01/12: Added combined heatmap for all ages to show cwFC values
  • 2022/01/13: Saved output from FindMarkers and load in as input instead (decreases runtime); setwd for cwFC plots part updated for knitR

To run: Set working directory “To Source File Location”.

Libraries and source scripts

#### Libraries ####
library(dplyr)
library(Seurat)
library(reshape2)
library(ggplot2)
library(ggpubr)
library(scMappR)
library(scales)
library(colorspace)
library(ggrepel)
library(openxlsx)
library(biomaRt)
library(pheatmap)
library(knitr)
library(EDASeq)
library(WGCNA)
library(RColorBrewer)

source("scmappr_analysis_functions_2022-01-11_rmd.R")
ensembl_marts <- readRDS("input_files/ensembl_marts.rds")
rat <- ensembl_marts[["rat"]]
mouse <- ensembl_marts[["mouse"]]

Make signature matrix for scMappR

Gene signature matrix is prepared for scMappR using both positive and negative gene markers identified by Seurat FindAllMarkers function. Signature matrix contains odds ratio calculated by scMappR generes_to_heatmap function.

# Make scmappr input (OR matrix) ####
dir.create("output_files/scmappr_20220111/")
pit_seurat_manual <- readRDS("output_files/seurat_v3_cheung_etal_manual_cell_anno.rds")
# 
# man_markers <- FindAllMarkers(pit_seurat_manual, min.pct = 0.25)
# man_markers <- 
#   mutate(man_markers, cluster = gsub(" ", "_", cluster)) %>%
#   mutate(cluster = gsub("/", "_", cluster)) %>%
#   mutate(cluster = gsub("(", "", cluster, fixed = T)) %>%
#   mutate(cluster = gsub(")", "", cluster, fixed = T))
# saveRDS(man_markers, "input_files/seurat_v3_man_markers.rds")
# 
# man_markers$cluster <- factor(man_markers$cluster, levels = c("Somatotropes", "Lactotropes", "Gonadotropes", "Stem-cells_Sox2_FSC",
#                                                               "Proliferating_Pou1f1", "Vascular_Endothelia", "Corticotropes",
#                                                               "Melanotropes_intermediate", "Connective_tissue_VLMC", "Thyrotropes",
#                                                               "Immune_cells", "Pituicytes_posterior"))

man_markers <- readRDS("input_files/seurat_v3_man_markers.rds")
gene_res <- lapply(levels(man_markers$cluster), function(x) man_markers[man_markers$cluster == x, ])
names(gene_res) <- levels(man_markers$cluster)
gene_res <- lapply(gene_res, function(x) {rownames(x) <- as.character(x$gene); x})
gene_res <- lapply(gene_res, function(x) x[, c(5, 2)])

wilcoxon_scmappr <- generes_to_heatmap(gene_res, species = "mouse", make_names = F)
kable(head(wilcoxon_scmappr$OR), caption = "Example gene OR in signature matrix.")
Example gene OR in signature matrix.
Somatotropes Lactotropes Gonadotropes Stem-cells_Sox2_FSC Proliferating_Pou1f1 Vascular_Endothelia Corticotropes Melanotropes_intermediate Connective_tissue_VLMC Thyrotropes Immune_cells Pituicytes_posterior
Gh 3.867637 0.1062669 0.1901384 0.4168312 1.258029 0.3553396 0.2136421 0.1499571 0.2912815 0.000000 0.4256131 0.2656725
Dapl1 1.692312 0.6755260 0.5696352 0.7269411 0.000000 0.6122095 0.5941515 0.5591689 0.6183363 1.229391 0.6137826 0.6125364
Dlk1 1.682026 0.7366456 0.3757551 0.4593889 0.000000 0.3796643 0.5515856 0.2337082 0.3696772 1.499816 0.4551570 0.3852214
Ghrhr 1.449442 0.7119646 0.7643590 0.8133271 0.000000 0.7988832 0.7656538 0.7469365 0.7759623 0.000000 0.8074564 0.8020018
Snhg18 1.392883 0.7996775 0.6637328 0.7395708 0.000000 0.5895890 0.7640083 0.0000000 1.5379984 0.000000 0.6461410 0.0000000
Ppp1r14a 1.270238 0.7196286 0.7659195 0.8128757 0.000000 1.2359143 0.7735070 0.7369251 2.1638462 0.000000 0.7834803 0.7725916
write.table(cbind("GENENAME" = rownames(wilcoxon_scmappr$OR), wilcoxon_scmappr$OR), 
            "output_files/scmappr_20220111/OR_sig_mat.txt",
            quote = F, sep = "\t", col.names = T, row.names = F)

scMappR deconvolution methods comparison

By default, scMappR uses DeconRNASeq as the deconvolution method to estimate cell proportions. Other deconvolution methods can also be run so that estiamted cell proportions from each method can be compared. These methods include WGCNA, DCQ and DeconRNASeq. It is recommended to choose the deconvolution method that best matches prior knowledge of cell proportions. In our study, we chose DeconRNASeq to estimate cell proportions for downstream analysis as the results are most similar to CIBERSORT estimated cell proportions.

# Compare scMappR deconvolution methods ####
utr_obj <- readRDS("input_files/pit_utr_2019__RUV_k2_set1_2019-07-03.rds")
utr_expr <- normCounts(utr_obj)
decon_method <- compare_deconvolution_methods(utr_expr, signature_matrix = wilcoxon_scmappr$OR)
# print(decon_method)
ggsave("output_files/scmappr_20220111/decon_compare.pdf", last_plot(), device = "pdf",
       width = 8, height = 6)

# gg_def_pal <- hue_pal()(12)
gg_def_pal <- hue_pal()(length(colnames(decon_method$cellType_proportions$DeconRNAseq)))
lighter_cluster_colours <- sapply(gg_def_pal, function(x) lighten(x, amount = 0.5))
cluster_colours <- sapply(gg_def_pal, function(x) darken(x, amount = 0.2))
use_colors <- lapply(1:length(cluster_colours), function(x) c("F" = lighter_cluster_colours[[x]], "M" = cluster_colours[[x]]))
names(use_colors) <- colnames(decon_method$cellType_proportions$DeconRNAseq)

all_decon_plots <- lapply(names(decon_method$cellType_proportions), function(x) make_decon_plots(x,
                                                                                                 file_out="output_files/scmappr_20220111/"))
print(all_decon_plots[[1]])
DeconRNASeq estimated cell proportions.

DeconRNASeq estimated cell proportions.

print(all_decon_plots[[2]])
DCQ estimated cell proportions.

DCQ estimated cell proportions.

print(all_decon_plots[[3]])
WGCNA estimated cell proportions.

WGCNA estimated cell proportions.

Run scMappR

scMappR is run to calculate cell-weighted fold-change (cwFC) for each DE gene identified by bulk analysis by incorporating estimated cell proportions. Here, we run scMappR for sex-biased genes from each of the profiled ages (D12, 22, 27, 32, 37).

# Run scMappR ####
bulk_DE_all <- readRDS("input_files/pit_utr_2019_de_result_list_2019-07-03.rds")
bulk_DE <- lapply(bulk_DE_all, function(x) x[abs(x$logFC) > log2(1.5) & x$FDR < 0.05, ])
bulk_normalized <- utr_expr
odds_ratio_in <- wilcoxon_scmappr$OR

meta <- pData(utr_obj)
max_proportion_change <- 10
theSpecies <- "mouse"
# setwd("output_files/")
knitr::opts_knit$set(root.dir = 'output_files/')
contrast_df <- matrix(c("Pd12F", "Pd12M", "Pd22F", "Pd22M", "Pd27F", "Pd27M", "Pd32F", "Pd32M", "Pd37F", "Pd37M",
                        "Pd22M", "Pd12M", "Pd27M", "Pd22M", "Pd32M", "Pd27M", "Pd37M", "Pd32M",
                        "Pd22F", "Pd12F", "Pd27F", "Pd22F", "Pd32F", "Pd27F", "Pd37F", "Pd32F",
                        "Pd37M", "Pd12M", "Pd37F", "Pd12F", "Pd37M", "Pd22M", "Pd37F", "Pd22F"),
                      nrow = 17, ncol = 2, byrow = T, dimnames = list(names(bulk_DE), c("case", "ctrl")))
contrast_df <- contrast_df[-grep("vs", rownames(contrast_df)), ]

run_scmappr("d37_sex", contrast_df["d37_sex", 1], contrast_df["d37_sex", 2], file_out = "./scmappr_20220111/")
## [1] "Pd37F"
## [1] "Pd37M"
run_scmappr("d32_sex", contrast_df["d32_sex", 1], contrast_df["d32_sex", 2], file_out = "./scmappr_20220111/")
## [1] "Pd32F"
## [1] "Pd32M"
run_scmappr("d27_sex", contrast_df["d27_sex", 1], contrast_df["d27_sex", 2], file_out = "./scmappr_20220111/")
## [1] "Pd27F"
## [1] "Pd27M"
run_scmappr("d22_sex", contrast_df["d22_sex", 1], contrast_df["d22_sex", 2], file_out = "./scmappr_20220111/")
## [1] "Pd22F"
## [1] "Pd22M"
run_scmappr("d12_sex", contrast_df["d12_sex", 1], contrast_df["d12_sex", 2], file_out = "./scmappr_20220111/")
## [1] "Pd12F"
## [1] "Pd12M"

Process cwFC results

scMappR cwFC results are used to select high-confidence genes which are likely cell-type specific DE genes. These high-confidence DE genes are compared to a list of known cell-type specific sex-biased genes in rat anterior pituitary from Fletcher et al. 2019. In addition, cell-type specific DE genes which have been implicated in pituitary disease and puberty disease as well as pubertal onset by GWAS are identified. Finally cell-type specific DE genes which have been reported as sex-biased in human pituitary by GTEx are also identified. If error is thrown (“cwFoldchange_gene_assigned not found”), then scMappR has found that ‘All DEGs are not normally distributed, suggesting very consistent cell-type specificity across genes.’ Hence, no cell-type specific sex-biased genes are identified.

# Process the cwFC results ####

names(gg_def_pal) <- c("Somatotropes", "Lactotropes", "Gonadotropes",
                       "Stem-cells_Sox2_FSC", "Proliferating_Pou1f1",
                       "Vascular_Endothelia", "Corticotropes",
                       "Melanotropes_intermediate", "Connective_tissue_VLMC",
                       "Thyrotropes", "Immune_cells", "Pituicytes_posterior")
gg_def_pal_scmappr <- c(gg_def_pal, "not_cw_DE" = "gray50")


fletcher_DE <- read.table("../input_files/2019_Fletcher_rat_ant_pit_sex_bias.txt",sep = "\t", header = T)
# mouse <- useEnsembl(biomart ="genes", dataset = "mmusculus_gene_ensembl")
# rat <- useEnsembl(biomart = "genes", dataset = "rnorvegicus_gene_ensembl")
# saveRDS(list(mouse = mouse, rat = rat), "input_files/ensembl_marts.rds")
check_rno_genes <- getBM(attributes = c("rgd_symbol", "ensembl_gene_id"), filters = "rgd_symbol",
                         values = fletcher_DE$genename, mart = rat)
colnames(check_rno_genes) <- c("genename", "ensembl_gene_id")
check_rno_genes <- full_join(fletcher_DE, check_rno_genes, by = "genename")

pit_pub_genes <- read.table("../input_files/pituitary_puberty_genes_combined_2020-09-28.txt", sep = "\t", header = T)
colnames(pit_pub_genes) <- c("genename", "source", "source_group")

gtex_genes <- melt(readRDS("../input_files/Oliva_science_2021_pit_sex_top500_genes_overlap.rds"),
                   id.vars = c("genename", "ENSEMBL_ID", "HUGO_gene_id", "MASH.beta", "MASH.sd", "MASH.LFSR", "chr"))
knitr::opts_knit$set(root.dir = 'output_files/scmappr_20220111/')
# setwd("scmappr_20220111")
cwfc12 <- calc_cwfc_plots(12)
Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD12.

Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD12.

save_pheatmap_pdf(x=cwfc12[1],
                  filename=paste0("scMappR_pituitary_d12", "_sex/cwFC_val_results/d12",
                                  "_cwFC_geneassigned_heatmap_cwFC_20120111.pdf"), width = 10)
write.xlsx(list(cwfc12[2],cwfc12[3], cwfc12[4]), paste0("scMappR_pituitary_d12", "_sex/cwFC_val_results/d12",
                                                        "_cwFC_geneassigned_genelists_overlap_20120111.xlsx"),
           colNames = T,
           sheetName = names(cwfc12[2:4]))
cwfc22 <- calc_cwfc_plots(22)
Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD22.

Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD22.

save_pheatmap_pdf(x=cwfc22[1],
                  filename=paste0("scMappR_pituitary_d22", "_sex/cwFC_val_results/d22",
                                  "_cwFC_geneassigned_heatmap_cwFC_20220111.pdf"), width = 10)
write.xlsx(list(cwfc22[2],cwfc22[3], cwfc22[4]), paste0("scMappR_pituitary_d22", "_sex/cwFC_val_results/d22",
                                                        "_cwFC_geneassigned_genelists_overlap_20220111.xlsx"),
           colNames = T,
           sheetName = names(cwfc22[2:4]))
cwfc27 <- calc_cwfc_plots(27)
Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD27.

Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD27.

save_pheatmap_pdf(x=cwfc27[1],
                  filename=paste0("scMappR_pituitary_d27", "_sex/cwFC_val_results/d27",
                                  "_cwFC_geneassigned_heatmap_cwFC_20220111.pdf"), width = 10)
write.xlsx(list(cwfc27[2],cwfc27[3], cwfc27[4]), paste0("scMappR_pituitary_d27", "_sex/cwFC_val_results/d27",
                                                        "_cwFC_geneassigned_genelists_overlap_20220111.xlsx"),
           colNames = T,
           sheetName = names(cwfc27[2:4]))
cwfc32 <- calc_cwfc_plots(32)
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 3 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD32.

Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD32.

save_pheatmap_pdf(x=cwfc32[1],
                  filename=paste0("scMappR_pituitary_d32", "_sex/cwFC_val_results/d32",
                                  "_cwFC_geneassigned_heatmap_cwFC_20220111.pdf"), width = 10)
write.xlsx(list(cwfc32[2],cwfc32[3], cwfc32[4]), paste0("scMappR_pituitary_d32", "_sex/cwFC_val_results/d32",
                                                        "_cwFC_geneassigned_genelists_overlap_20220111.xlsx"),
           colNames = T,
           sheetName = names(cwfc32[2:4]))
cwfc37 <- calc_cwfc_plots(37)
## Warning: ggrepel: 3 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

## Warning: ggrepel: 3 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD37.

Heatmap of gene-normalized cwFC for hormone-producing cell-type-specific sex-biased genes at PD37.

save_pheatmap_pdf(x=cwfc37[1],
                  filename=paste0("scMappR_pituitary_d37", "_sex/cwFC_val_results/d37",
                                  "_cwFC_geneassigned_heatmap_cwFC_20220111.pdf"), width = 10)
write.xlsx(list(cwfc37[2],cwfc37[3], cwfc37[4]), paste0("scMappR_pituitary_d37", "_sex/cwFC_val_results/d37",
                                                        "_cwFC_geneassigned_genelists_overlap_20220111.xlsx"),
           colNames = T,
           sheetName = names(cwfc37[2:4]))
cwfc_combined <- list(d12 = cwfc12[[5]], d22 = cwfc22[[5]], d27 = cwfc27[[5]], d32 = cwfc32[[5]], d37 = cwfc37[[5]])
cwfc_combined <- bind_rows(lapply(names(cwfc_combined), function(x) mutate(as.data.frame(cwfc_combined[[x]]), age = x, gene = rownames(cwfc_combined[[x]]))))
cwfc_melt <- melt(cwfc_combined)
colnames(cwfc_melt) <- c("age", "gene", "celltype", "cwFC")

cwfc_melt <- arrange(cwfc_melt, cwFC, celltype)

cwfc_melt_combined <- mutate(cwfc_melt, age_cell = paste0(celltype, "_", age))
geneorder <- unique(cwfc_melt$gene)
agecellorder <- paste0(rep(c("Somatotropes", "Lactotropes", "Gonadotropes", "Corticotropes",
                             "Melanotropes_intermediate", "Thyrotropes"), each=5), "_",
                       rep(c("d12", "d22", "d27", "d32", "d37"), 6))
use_breaks <- get_htmap_breaks(cwfc_melt_combined$cwFC,
                               colorRampPalette(c("orange", "white", "darkmagenta"))(255))
cwfc_melt_combined_df <- dcast(cwfc_melt_combined, gene~age_cell, value.var = "cwFC")
cwfc_melt_combined_df <- cwfc_melt_combined_df[order(match(cwfc_melt_combined_df$gene, geneorder)), ]
rownames(cwfc_melt_combined_df) <- cwfc_melt_combined_df$gene
cwfc_melt_combined_df <- dplyr::select(cwfc_melt_combined_df, -gene)

cwfc_melt_combined_df <- cwfc_melt_combined_df[, order(match(colnames(cwfc_melt_combined_df), agecellorder))]
cwfc_melt_combined_df[is.na(cwfc_melt_combined_df)] <- 0

row_anno <- data.frame(rep(c("Somatotropes", "Lactotropes", "Gonadotropes", "Corticotropes",
                             "Melanotropes_intermediate", "Thyrotropes"), each=5),
                       rep(c("d12", "d22", "d27", "d32", "d37"), 6),
                       paste0(rep(c("Somatotropes", "Lactotropes", "Gonadotropes", "Corticotropes",
                                    "Melanotropes_intermediate", "Thyrotropes"), each=5), "_",
                              rep(c("d12", "d22", "d27", "d32", "d37"), 6)))
colnames(row_anno) <- c("celltype", "age", "cellage")
rownames(row_anno) <- row_anno$cellage
row_anno <- dplyr::select(row_anno, -cellage)
agepal <- brewer.pal(n = 9, "BuGn")[c(1,3,5,7,9)]
names(agepal) <- unique(row_anno$age)
row_anno_pal <- list(age = agepal,
                     celltype = gg_def_pal[names(gg_def_pal) %in% c("Somatotropes", "Lactotropes", "Gonadotropes", "Corticotropes",
                                                                    "Melanotropes_intermediate", "Thyrotropes")])
p <- pheatmap(t(cwfc_melt_combined_df),
              # scale = "column",
              cluster_cols = T,
              cluster_rows = F,
              color = colorRampPalette(c("orange", "white", "darkmagenta"))(255),
              breaks = use_breaks,
              gaps_row = c(5,10,15,20,25,30),
              annotation_row = row_anno,
              annotation_colors = row_anno_pal,
              cellheight = 10, cellwidth = 8)

save_pheatmap_pdf(list(p), filename="cwFC_geneassigned_heatmap_cwFC_combined_20220111.pdf",
                  width = 17, height = 8)

Session Info

sessionInfo()
## R version 4.1.2 (2021-11-01)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Mojave 10.14.6
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] RColorBrewer_1.1-2          WGCNA_1.70-3               
##  [3] fastcluster_1.2.3           dynamicTreeCut_1.63-1      
##  [5] EDASeq_2.28.0               ShortRead_1.52.0           
##  [7] GenomicAlignments_1.30.0    SummarizedExperiment_1.24.0
##  [9] MatrixGenerics_1.6.0        matrixStats_0.61.0         
## [11] Rsamtools_2.10.0            GenomicRanges_1.46.1       
## [13] Biostrings_2.62.0           GenomeInfoDb_1.30.0        
## [15] XVector_0.34.0              IRanges_2.28.0             
## [17] S4Vectors_0.32.3            BiocParallel_1.28.3        
## [19] Biobase_2.54.0              BiocGenerics_0.40.0        
## [21] knitr_1.37                  pheatmap_1.0.12            
## [23] biomaRt_2.50.1              openxlsx_4.2.5             
## [25] ggrepel_0.9.1               colorspace_2.0-2           
## [27] scales_1.1.1                scMappR_1.0.7              
## [29] ggpubr_0.4.0                ggplot2_3.3.5              
## [31] reshape2_1.4.4              Seurat_3.2.3               
## [33] dplyr_1.0.7                
## 
## loaded via a namespace (and not attached):
##   [1] rappdirs_0.3.3              rtracklayer_1.54.0         
##   [3] scattermore_0.7             R.methodsS3_1.8.1          
##   [5] tidyr_1.1.4                 bit64_4.0.5                
##   [7] irlba_2.3.5                 aroma.light_3.24.0         
##   [9] DelayedArray_0.20.0         R.utils_2.11.0             
##  [11] data.table_1.14.2           rpart_4.1-15               
##  [13] hwriter_1.3.2               KEGGREST_1.34.0            
##  [15] RCurl_1.98-1.5              doParallel_1.0.16          
##  [17] generics_0.1.1              preprocessCore_1.56.0      
##  [19] GenomicFeatures_1.46.3      ScaledMatrix_1.2.0         
##  [21] cowplot_1.1.1               RSQLite_2.2.9              
##  [23] RANN_2.6.1                  future_1.23.0              
##  [25] bit_4.0.4                   spatstat.data_2.1-2        
##  [27] xml2_1.3.3                  httpuv_1.6.5               
##  [29] assertthat_0.2.1            xfun_0.29                  
##  [31] hms_1.1.1                   jquerylib_0.1.4            
##  [33] evaluate_0.14               promises_1.2.0.1           
##  [35] fansi_1.0.0                 restfulr_0.0.13            
##  [37] progress_1.2.2              dbplyr_2.1.1               
##  [39] igraph_1.2.11               DBI_1.1.2                  
##  [41] htmlwidgets_1.5.4           reshape_0.8.8              
##  [43] purrr_0.3.4                 ellipsis_0.3.2             
##  [45] backports_1.4.1             gprofiler2_0.2.1           
##  [47] annotate_1.72.0             deldir_1.0-6               
##  [49] sparseMatrixStats_1.6.0     vctrs_0.3.8                
##  [51] SingleCellExperiment_1.16.0 ROCR_1.0-11                
##  [53] abind_1.4-5                 cachem_1.0.6               
##  [55] withr_2.4.3                 checkmate_2.0.0            
##  [57] sctransform_0.3.2           prettyunits_1.1.1          
##  [59] goftest_1.2-3               cluster_2.1.2              
##  [61] lazyeval_0.2.2              crayon_1.4.2               
##  [63] labeling_0.4.2              glmnet_4.1-3               
##  [65] pkgconfig_2.0.3             nlme_3.1-153               
##  [67] nnet_7.3-16                 rlang_0.4.12               
##  [69] globals_0.14.0              lifecycle_1.0.1            
##  [71] miniUI_0.1.1.1              downloader_0.4             
##  [73] filelock_1.0.2              BiocFileCache_2.2.0        
##  [75] rsvd_1.0.5                  polyclip_1.10-0            
##  [77] GSVA_1.42.0                 lmtest_0.9-39              
##  [79] graph_1.72.0                Matrix_1.4-0               
##  [81] carData_3.0-5               Rhdf5lib_1.16.0            
##  [83] zoo_1.8-9                   base64enc_0.1-3            
##  [85] ggridges_0.5.3              png_0.1-7                  
##  [87] viridisLite_0.4.0           rjson_0.2.21               
##  [89] bitops_1.0-7                R.oo_1.24.0                
##  [91] KernSmooth_2.23-20          rhdf5filters_1.6.0         
##  [93] blob_1.2.2                  DelayedMatrixStats_1.16.0  
##  [95] shape_1.4.6                 stringr_1.4.0              
##  [97] parallelly_1.30.0           gProfileR_0.7.0            
##  [99] jpeg_0.1-9                  rstatix_0.7.0              
## [101] ggsignif_0.6.3              beachmat_2.10.0            
## [103] lpSolve_5.6.15              memoise_2.0.1              
## [105] GSEABase_1.56.0             magrittr_2.0.1             
## [107] plyr_1.8.6                  ica_1.0-2                  
## [109] zlibbioc_1.40.0             compiler_4.1.2             
## [111] BiocIO_1.4.0                pcaMethods_1.86.0          
## [113] fitdistrplus_1.1-6          listenv_0.8.0              
## [115] patchwork_1.1.1             pbapply_1.5-0              
## [117] htmlTable_2.4.0             Formula_1.2-4              
## [119] MASS_7.3-54                 mgcv_1.8-38                
## [121] limSolve_1.5.6              tidyselect_1.1.1           
## [123] stringi_1.7.6               highr_0.9                  
## [125] yaml_2.2.1                  BiocSingular_1.10.0        
## [127] latticeExtra_0.6-29         grid_4.1.2                 
## [129] sass_0.4.0                  tools_4.1.2                
## [131] future.apply_1.8.1          parallel_4.1.2             
## [133] ComICS_1.0.4                rstudioapi_0.13            
## [135] foreign_0.8-81              foreach_1.5.1              
## [137] gridExtra_2.3               farver_2.1.0               
## [139] Rtsne_0.15                  digest_0.6.29              
## [141] shiny_1.7.1                 quadprog_1.5-8             
## [143] Rcpp_1.0.7                  car_3.0-12                 
## [145] broom_0.7.11                later_1.3.0                
## [147] RcppAnnoy_0.0.19            httr_1.4.2                 
## [149] AnnotationDbi_1.56.2        XML_3.99-0.8               
## [151] tensor_1.5                  reticulate_1.22            
## [153] splines_4.1.2               uwot_0.1.11                
## [155] spatstat.utils_2.3-0        plotly_4.10.0              
## [157] xtable_1.8-4                jsonlite_1.7.2             
## [159] spatstat_1.64-1             R6_2.5.1                   
## [161] Hmisc_4.6-0                 pillar_1.6.4               
## [163] ADAPTS_1.0.21               htmltools_0.5.2            
## [165] mime_0.12                   glue_1.6.0                 
## [167] fastmap_1.1.0               codetools_0.2-18           
## [169] utf8_1.2.2                  lattice_0.20-45            
## [171] bslib_0.3.1                 tibble_3.1.6               
## [173] curl_4.3.2                  leiden_0.3.9               
## [175] GO.db_3.14.0                zip_2.2.0                  
## [177] survival_3.2-13             rmarkdown_2.11             
## [179] munsell_0.5.0               rhdf5_2.38.0               
## [181] GenomeInfoDbData_1.2.7      iterators_1.0.13           
## [183] impute_1.68.0               HDF5Array_1.22.1           
## [185] gtable_0.3.0